// 导入数据库操作模块
const db = require('../db/index')
// 导入 bcryptjs
const bcrypt = require('bcryptjs')
// 导入 token 模块
const jwt = require('jsonwebtoken')
const { result } = require('joi/lib/base')
// 导入配置文件
const config = require('../config/config.js')

// 注册用户的处理函数
exports.regUser = (req,res)=>{
  // 接收表单数据
  const userinfo = req.body
  // 不用这种验证了，有专门的第三方验证规则
  // if(!userinfo.username || !userinfo.password){
  //   // return res.send({ status: 1, message: '用户名或密码不能为空！' })
  //   return res.cc('用户名或密码不能为空！')
  // }
  // 定义查询语句
  let sql = 'select * from ev_users where username=?'
  db.query(sql,userinfo.username,(err,results)=>{
    // 执行SQL语句失败
    if(err){
      // return res.send({ status: 1, message: err.message })
      return res.cc(err.message)
    }
    // 用户名被占用
    if(results.length>0){
      // return res.send({status: 1, message: '用户名被占用，请更换其他用户名！'})
      return res.cc('用户名被占用，请更换其他用户名！')
    }
    // 用户名可以使用
    // 对用户名进行加密处理
    userinfo.password = bcrypt.hashSync(userinfo.password,10)
    // 定义插入用户SQL语句
    sql = 'insert into ev_users set ?'
    // 执行SQL语句
    db.query(sql,{username:userinfo.username,password:userinfo.password},(err,results)=>{
      // 执行 SQL 语句失败
      // if(err) return res.send({ status: 1, message: err.message })
      if(err) return res.cc(err.message)
      // 执行 sql 语句成功,但影响函数不为 1
      if(results.affectedRows !==1){
        // return res.send({ status: 1, message: '注册用户失败，请稍后再试！' })
        return res.cc('注册用户失败，请稍后再试！')
      }
      // 注册成功
      // res.send({ status: 0, message: '注册成功！' })
      res.cc('注册成功！',0)
    })
  })
}

// 登陆的处理函数
exports.login = (req,res)=>{
  // 接收表单的数据
  const userinfo = req.body
  // 定义 SQL 语句
  let sql = 'select * from ev_users where username=?';
  db.query(sql,userinfo.username,(err,results)=>{
    // 执行 SQL 语句失败
    if(err) return res.cc(err)
    // 执行 SQL 语句成功，但是查询到数据条数不等于1
    if(results.length!==1) return res.cc('登陆失败！')
    // 拿着用户输入的密码，和数据库的密码比较看是否一致
    const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)
    // 如果结果为false，则证明用户输入的密码错误
    if(!compareResult) {
      return res.cc('登陆失败！')
    }
    // 剔除密码和头像的值
    const user = {...results[0],password:'',user_pic:''}
    // 生成 Token 字符串
    const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn:config.expiresIn})
    // 调用 res.send 将 Token 字符串响应给客户端
    res.send({
      status: 0,
      message: '登录成功！',
      // 为了方便客户端使用 Token，在服务器端直接拼接上 Bearer 的前缀
      token: 'Bearer ' + tokenStr,
    })
  })

}